package com.sicheng.蓝桥.练习题.基础数论.阶乘;

import java.util.Scanner;

/**
 * @author zsc
 * @version 1.0
 * @date 2022/5/7 15:12
 */
public class 阶乘差 {
    /**
     * 题目描述
     * 给定n和m以及p，保证n>=m，求(n!-m!)对p取余的结果。
     * 输入
     * 一行三个正整数n,m,p。
     * 输出
     * 一行一个非负整数表示结果。
     * 样例输入
     * 3 2 10
     * 样例输出
     * 4
     */

    // 考虑n，m达到一定值就会爆 long
    // n>m
    // n!=1*2*3..*m*(m+1)*...*n
    // m!=1*2*3..*m
    // n!-m!=1*2*3*..*m*((m+1)*(m+2)*...*n - 1)
    // mod 运算在一边乘一边mod
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        long n = scanner.nextLong();
        long m = scanner.nextLong();
        long p = scanner.nextLong();
        //先算 (1*2*3*..*m)%p
        //再算 ((m+1)*(m+2)*...*n - 1)%p=====>(((m+1)*(m+2)*...*n)%p+(p-1))%p

        // 首先此题有技巧  (a*b)%p=((a%p)*(b%p))%p
        // 所以 根据结合律是可以一边乘一边mod，防止long越界
        // 其次 (x+y)%p= ((x%p)+(y%p))%p
        // 不好理解的是(x-y)%p，相当于是(x-y)不断减p直到结果小于p
        // 可以想成是 x 不断减p  把减掉的p转移一部分到-y上,直到-y变成一个大于0的数
        // (x-np) +(np-y)=x-y
        // 然后 (x-y)%p====>(x+(-y))%p=====>((x%p)+(n*p-y)%p)%p

        long res1 = 1;
        // 这里就是 (1*2*3*..*m)%p
        for (int i = 1; i <= m; i++) {
            res1 = res1 * i % p;
        }
        long res2 = 1;
        // ((m+1)*(m+2)*...*n)%p
        for (long i = m + 1; i <= n; i++) {
            res2 = res2 * i % p;
        }
        //这里就是 (res2-1)%p===>挪一个p给-1
        res2 = (res2 + p - 1) % p;
        System.out.println((res1 + res2) % p);
    }
}
